package shortURL

import (
	"MyWeb/internal/models"
	"MyWeb/internal/pkg/vaildator"
	"errors"
	"github.com/gin-gonic/gin"
	"net/http"
)

// todo POST /api/v1/shorturl    long_url ExpiresAt => 短链接 ，过期时间
// todo GET  /:code      把短链接URL重定向到长的URL里面

type URLService interface {
	CreateURL(c *gin.Context, req models.UrlRequest) (*models.UrlResponse, error)
	GetLongURL(c *gin.Context, shortcode string) (string, error)
}

type URLHandler struct {
	uRLService URLService
	//可以任意切换接口的实现
}

func NewURLHandler(service URLService) *URLHandler {
	return &URLHandler{
		uRLService: service,
	}
}

// CreateURL
// @Summary      生成短链接的api
// @Description  用来处理前端传入的长连接（not null），用户自定义的短链接（可null），有效时间（null），中间有模块验证，返回短链接和过期时间
// @Accept       json
// @Produce      json
// @Param long_url body string true "长链接"
// @Param custom_code body string false "用户自定义的短链接，长度范围4-10"
// @Param used_time body int false "设置的有效时间"
// @Success      200  {object}  models.UrlResponse
// @Failure      400
// @Failure      500
// @Router       /api/v1/shorturl [POST]
func (h *URLHandler) CreateURL(c *gin.Context) {
	// 提取数据
	var req models.UrlRequest
	if err := c.ShouldBindJSON(&req); err != nil {
		c.JSON(http.StatusBadRequest, gin.H{
			"code": http.StatusBadRequest,
			"msg":  errors.New("解析数据请求失败").Error(),
		})
		return
	}

	// 验证数据格式
	if msg, err := vaildator.Validate(&req); err != nil {
		c.JSON(http.StatusOK, gin.H{
			"code": http.StatusBadRequest,
			"msg":  msg,
		})
		return
	}

	// 调用业务逻辑函数
	resp, err := h.uRLService.CreateURL(c, req)
	if err != nil {
		// 如果有问题就返回
		c.JSON(http.StatusOK, gin.H{
			"code": http.StatusInternalServerError,
			"msg":  err.Error(), // 转化为字符串
		})
		return
	}

	// 返回响应
	c.JSON(http.StatusOK, resp)
}

// RedirectURL
// @Summary 重定向api
// @Description  用户输入短链之后重定向到长链的操作
// @Param code query string true "短链"
// @Success      200
// @Failure      302
// @Failure      500
// @Router       /api/v1/:code [GET]
func (h *URLHandler) RedirectURL(c *gin.Context) {
	// 取出短链的code :-> 短链 = baseurl + / + shorturl
	shortUrl := c.Param("code")

	// 调用业务函数
	LongURL, err := h.uRLService.GetLongURL(c, shortUrl)

	if err != nil {
		c.JSON(http.StatusInternalServerError, gin.H{
			"code": http.StatusInternalServerError,
			"msg":  err.Error(),
		})
		return
	}

	// 重定向
	c.Redirect(http.StatusMovedPermanently, LongURL)
	//c.JSON(http.StatusOK, gin.H{
	//	"code": shortUrl,
	//})
}
